/**
 * @description 通用异步防抖函数封装工具（原理就是闭包 + 定时器）
 * @param asyncFunction 异步函数
 * @param delay 操作时间间隔（单位：ms）
 * @returns 异步防抖函数
 */
export function debounce<T>(
    asyncFunction: (value: T) => Promise<any>,
    delay: number
): (value: T) => Promise<any> {
    let timeoutId: number | null = null;
    return async (value: T) => {
        if (timeoutId !== null) {
            clearTimeout(timeoutId);
        }
        return new Promise((resolve) => {
            timeoutId = setTimeout(async () => {
                const result = await asyncFunction(value);
                resolve(result);
            }, delay);
        });
    };
}

/**
 * @description 判断一个字符串是否能够转成整数
 * @param str 目标字符串
 */
export function canConvertToInteger(str:string) {
    const num = parseInt(str, 10);
    return !isNaN(num) && num.toString() === str.trim();
}

/**
 * @description 轮询请求封装函数
 * @param delay 请求时间间隔
 * @param requestFunc 请求函数（异步）
 * @param judgeRepeatFunc 请求结果处理函数，返回布尔值，true表示继续轮询
 */
export function pollRequest(delay:number,requestFunc:Function,judgeRepeatFunc:(result:any) => boolean,...requestArgs:any[]){
    const timer = setInterval(async ()=>{
        // 调用请求函数
        const result:any = await requestFunc(...requestArgs);
        // 将请求结果传入用户定义的回调函数中，看是否继续轮询
        if(!judgeRepeatFunc(result)){
            clearInterval(timer);
        }
    },delay);
}